package com.tom.architect.party3.day30;

public class ObservableMap<T, R> extends Observable<R> {
    final Observable<T> source; // 前面的Observable，指向前一个对象[上游的对象]。上游的Observable对象。ObservableJust。
    final Function<T, R> function; // 当前要转换的

    public ObservableMap(Observable<T> source, Function<T, R> function) {
        this.source = source;
        this.function = function;
    }

    @Override
    protected void subscribeActual(Observer<R> observer) {
        // 第一步：订阅 MapObserver，一级一级往上传，直到第一个just().

        // 对 observer 又包裹了一层，调上游的订阅。observer 代表下游给我们封装好的observer对象。
        // 管上面： source.subscribe
        // 管下面： 对下面的进行包裹 new MapObserver<>(observer, function)
        source.subscribe(new MapObserver<>(observer, function));
    }

    // 静态代理，注意泛型的使用。
    private class MapObserver<T> implements Observer<T> {
        final Observer<R> observer;
        final Function<T, R> function;

        public MapObserver(Observer<R> source, Function<T, R> function) {
            this.observer = source;
            this.function = function;
        }

        @Override
        public void onSubscribe() {
            observer.onSubscribe();
        }

        @Override
        public void onNext(T item) { // 一级一级往下调用MapObserver 的onNext(),
            // eg：要去转换。String-> Bitmap
            // 第四步：function.apply 回调调用Function.apply()方法。
            try {
                R applyR = function.apply(item); // 调用apply, 拿到结果applyR
                // 第六步：调用onNext方法
                // 将bitmap（applyR对象）传出去显示，最终调用Consumer的onNext方法。
                observer.onNext(applyR); // onNext调用onNext：一层一层往下剥离。
            } catch (Exception e) {
                e.printStackTrace();
                observer.onError(e); // 处理异常逻辑
            }
        }

        @Override
        public void onError(Throwable e) {
            observer.onError(e);
        }

        @Override
        public void onComplete() {
            observer.onComplete();
        }
    }
}
